Reject manifest with duplicate dependencies in different targets
authorBoris Egorov <egorov@linux.com>
Thu, 17 Mar 2016 20:04:33 +0000 (02:04 +0600)
committerBoris Egorov <egorov@linux.com>
Tue, 22 Mar 2016 05:48:58 +0000 (11:48 +0600)
Closes #2023

src/cargo/util/toml.rs
tests/test_bad_config.rs

index 17f043cab15022a9a69beed9b0cc6ff080bddf53..44b24705acc51b94388ccdf1418a62e05260089c 100644 (file)
@@ -540,6 +540,18 @@ impl TomlManifest {
             }
         }
 
+        {
+            let mut names_sources = HashMap::new();
+            for dep in deps.iter() {
+                let name = dep.name();
+                let prev = names_sources.insert(name, dep.source_id());
+                if prev.is_some() && prev != Some(dep.source_id()) {
+                    bail!("found duplicate dependency name {}, but all \
+                           dependencies must have a unique name", name);
+                }
+            }
+        }
+
         let exclude = project.exclude.clone().unwrap_or(Vec::new());
         let include = project.include.clone().unwrap_or(Vec::new());
 
index afc91e8f65dcff63c2d79e7ed27f95cb36a01ccc..c0c36d0cded894ac46fb40fefdf68344d038d404 100644 (file)
@@ -383,6 +383,50 @@ Caused by:
     error = ERROR)));
 });
 
+test!(duplicate_deps {
+    let foo = project("foo")
+    .file("shim-bar/Cargo.toml", r#"
+       [package]
+       name = "bar"
+       version = "0.0.1"
+       authors = []
+    "#)
+    .file("shim-bar/src/lib.rs", r#"
+            pub fn a() {}
+    "#)
+    .file("linux-bar/Cargo.toml", r#"
+       [package]
+       name = "bar"
+       version = "0.0.1"
+       authors = []
+    "#)
+    .file("linux-bar/src/lib.rs", r#"
+            pub fn a() {}
+    "#)
+    .file("Cargo.toml", r#"
+       [package]
+       name = "qqq"
+       version = "0.0.1"
+       authors = []
+
+       [dependencies]
+       bar = { path = "shim-bar" }
+
+       [target.x86_64-unknown-linux-gnu.dependencies]
+       bar = { path = "linux-bar" }
+    "#)
+    .file("src/main.rs", r#"fn main () {}"#);
+
+    assert_that(foo.cargo_process("build"),
+                execs().with_status(101).with_stderr(&format!("\
+{error} failed to parse manifest at `[..]`
+
+Caused by:
+  found duplicate dependency name bar, but all dependencies must have a unique name
+",
+    error = ERROR)));
+});
+
 test!(unused_keys {
     let foo = project("foo")
         .file("Cargo.toml", r#"